package net.jeeshop.web.action.kindeditor;

import net.jeeshop.app.appobject.FileInfoAO;
import net.jeeshop.app.dao.gen.FileInfoGeneratedMapper;
import net.jeeshop.app.entity.gen.FileInfoCriteria;
import net.jeeshop.core.front.SystemManager;
import net.jeeshop.services.common.SystemSetting;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.alibaba.fastjson.JSONObject;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.*;

import javax.annotation.Resource;

/**
 * Created by dylan on 15-5-21.
 */
@Controller
@RequestMapping("editor")
public class KindController {
    private Logger logger = LoggerFactory.getLogger(getClass());
    
    @Resource
    private FileInfoGeneratedMapper fileInfoGeneratedMapper;


    @RequestMapping("fileManager")
    @ResponseBody
    public String fileManager(@RequestParam(value = "dir") String dirName, @RequestParam(required = false) String path,
                              @RequestParam(required = false, defaultValue = "name") String order,
                              @RequestParam(required = false) String productID) {
    	
    	
    	
      //遍历目录取的文件信息
      List<Hashtable> fileList = new ArrayList<Hashtable>();
      
		FileInfoCriteria example = new FileInfoCriteria();
		if(null != productID){
			example.createCriteria().andFormIdEqualTo(productID);
		}
		List<FileInfoAO> list =	fileInfoGeneratedMapper.selectByCriteria(example);
		for(FileInfoAO f:list){
			Hashtable<String, Object> hash = new Hashtable<String, Object>();
          hash.put("is_dir", false);
          hash.put("has_file", false);
          hash.put("filesize", f.getFileSize());
          hash.put("is_photo", true);
          hash.put("filetype", f.getFileExt());
          hash.put("filename", f.getFileId());
          hash.put("fileid", f.getFileId());
          hash.put("datetime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(f.getCreateAt()));	
			fileList.add(hash);
		}
      
      
    	
        SystemSetting systemSetting = SystemManager.getInstance().getSystemSetting();
//        String rootPath = SystemManager.getInstance().getProperty("file.upload.path");
        String rootUrl = systemSetting.getImageRootPath();
//        //图片扩展名
//        String[] fileTypes = new String[]{"gif", "jpg", "jpeg", "png", "bmp"};
//
//        if (StringUtils.isNotBlank(dirName)) {
//            if (!Arrays.<String>asList(new String[]{"image", "flash", "media", "file"}).contains(dirName)) {
//                return ("Invalid Directory name.");
//            }
//            rootPath += dirName + "/";
//            rootUrl += dirName + "/";
//            File saveDirFile = new File(rootPath);
//            if (!saveDirFile.exists()) {
//                saveDirFile.mkdirs();
//            }
//        }
//        //根据path参数，设置各路径和URL
//        path = path != null ? path.trim() : "";
//        String currentPath = rootPath + path;
//        String currentUrl = rootUrl + path;
        String currentDirPath = path;
        String moveupDirPath = "";
//        if (!"".equals(path)) {
//            String str = currentDirPath.substring(0, currentDirPath.length() - 1);
//            moveupDirPath = str.lastIndexOf("/") >= 0 ? str.substring(0, str.lastIndexOf("/") + 1) : "";
//        }
//
//        //排序形式，name or size or type
//        order = order != null ? order.trim().toLowerCase() : "name";
//
//        //不允许使用..移动到上一级目录
//        if (path.indexOf("..") >= 0) {
//            return ("Access is not allowed.");
//        }
//        //最后一个字符不是/
//        if (!"".equals(path) && !path.endsWith("/")) {
//            path += "/";
//        }
//        //目录不存在或不是目录
//        File currentPathFile = new File(currentPath);
//        if (!currentPathFile.isDirectory()) {
//            return ("Directory does not exist.");
//        }
//
//        //遍历目录取的文件信息
//        List<Hashtable> fileList = new ArrayList<Hashtable>();
//        Map<String, String> addFileMap = new HashMap<String, String>();
//        logger.debug("currentPathFile.listFiles=" + currentPathFile);
//        logger.debug("currentPathFile.listFiles=" + currentPathFile.listFiles());
//        if (currentPathFile.listFiles() != null) {
//            for (File file : currentPathFile.listFiles()) {
//                Hashtable<String, Object> hash = new Hashtable<String, Object>();
//                String fileName = file.getName();
//                logger.debug("fileName=" + fileName);
//                if (file.isDirectory()) {
//                    hash.put("is_dir", true);
//                    hash.put("has_file", (file.listFiles() != null));
//                    hash.put("filesize", 0L);
//                    hash.put("is_photo", false);
//                    hash.put("filetype", "");
//                } else if (file.isFile()) {
//                    String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
//
//                    String _fileName = fileName.substring(0, fileName.lastIndexOf("."));
//                    //String fileNameA = _fileName.split("_")[1];
//                    //logger.debug("fileNameA="+fileNameA);
//
//	 				/* if(fileNameA.equals("1") || fileNameA.equals("2")){
//                     //if(addFileMap.get(fileNameA)!=null){
//	 					continue;
//	 				} */
//                    //addFileMap.put(fileNameA, fileNameA);
//
//                    hash.put("is_dir", false);
//                    hash.put("has_file", false);
//                    hash.put("filesize", file.length());
//                    hash.put("is_photo", Arrays.<String>asList(fileTypes).contains(fileExt));
//                    hash.put("filetype", fileExt);
//                }
//                hash.put("filename", fileName);
//                hash.put("datetime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(file.lastModified()));
//                fileList.add(hash);
//            }
//        }

        if ("size".equals(order)) {
            Collections.sort(fileList, new SizeComparator());
        } else if ("type".equals(order)) {
            Collections.sort(fileList, new TypeComparator());
        } else {
            Collections.sort(fileList, new NameComparator());
        }
        JSONObject result = new JSONObject();
        result.put("moveup_dir_path", moveupDirPath);
        result.put("current_dir_path", currentDirPath);
        result.put("current_url", rootUrl);
        result.put("total_count", fileList.size());
        result.put("file_list", fileList);

        logger.debug("json=" + result.toString());
        return (result.toString());
    }

    public class NameComparator implements Comparator {
        public int compare(Object a, Object b) {
            Hashtable hashA = (Hashtable) a;
            Hashtable hashB = (Hashtable) b;
            if (((Boolean) hashA.get("is_dir")) && !((Boolean) hashB.get("is_dir"))) {
                return -1;
            } else if (!((Boolean) hashA.get("is_dir")) && ((Boolean) hashB.get("is_dir"))) {
                return 1;
            } else {
                return ((String) hashA.get("filename")).compareTo((String) hashB.get("filename"));
            }
        }
    }

    public class SizeComparator implements Comparator {
        public int compare(Object a, Object b) {
            Hashtable hashA = (Hashtable) a;
            Hashtable hashB = (Hashtable) b;
            if (((Boolean) hashA.get("is_dir")) && !((Boolean) hashB.get("is_dir"))) {
                return -1;
            } else if (!((Boolean) hashA.get("is_dir")) && ((Boolean) hashB.get("is_dir"))) {
                return 1;
            } else {
                if (((Long) hashA.get("filesize")) > ((Long) hashB.get("filesize"))) {
                    return 1;
                } else if (((Long) hashA.get("filesize")) < ((Long) hashB.get("filesize"))) {
                    return -1;
                } else {
                    return 0;
                }
            }
        }
    }

    public class TypeComparator implements Comparator {
        public int compare(Object a, Object b) {
            Hashtable hashA = (Hashtable) a;
            Hashtable hashB = (Hashtable) b;
            if (((Boolean) hashA.get("is_dir")) && !((Boolean) hashB.get("is_dir"))) {
                return -1;
            } else if (!((Boolean) hashA.get("is_dir")) && ((Boolean) hashB.get("is_dir"))) {
                return 1;
            } else {
                return ((String) hashA.get("filetype")).compareTo((String) hashB.get("filetype"));
            }
        }
    }
}
